/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package XML;

import UI.Circulo;
import UI.Linea;
import java.io.File;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Element;
import org.w3c.dom.Document;
import org.w3c.dom.Attr;
/**
 *
 * @author Marco
 */
public class CreaXMl {
   /**
    * El conujunto de arcos y nodos apartir de cual crea el xml
    */ 
   ArrayList<Circulo> nodos;
   ArrayList<Linea> arcos;
   
   public CreaXMl(ArrayList<Circulo> pnodos, ArrayList<Linea> parcos ){
    this.nodos=pnodos;
    this.arcos=parcos;
   
   }
   
   
   public void crearXml(String ruta){
       try{  
     
       DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
       DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
       
       //elemnto raiz
       Document doc = docBuilder.newDocument();
       Element rootElement = doc.createElement("grafo"); 
       doc.appendChild(rootElement);
       
       //Creo los elementos nodos
       for(Circulo nodo:nodos){
                Element xNodo = doc.createElement("Nodo");
                rootElement.appendChild(xNodo);
                 //creo los atributos del elemnto
                //numero
                Attr numero = doc.createAttribute("numero");
		numero.setValue(""+nodo.getNumeroNodo());
		xNodo.setAttributeNode(numero);
                
                //posicion en x
                Attr posicionx = doc.createAttribute("posicionx");
		posicionx.setValue(""+nodo.getX());
		xNodo.setAttributeNode(posicionx);
                //posicion en y
                
                Attr posiciony = doc.createAttribute("posiciony");
		posiciony.setValue(""+nodo.getY());
		xNodo.setAttributeNode(posiciony);
                
                //peso
                Attr peso = doc.createAttribute("peso");
		peso.setValue(""+nodo.getPeso());
		xNodo.setAttributeNode(peso);
                
		
                            
               
            
                
                
       }
         // elementosarcos  
       for(Linea arco:arcos){
             Element xArco = doc.createElement("Arco");
             rootElement.appendChild(xArco);
             
             //demomento los atributos que guardo son el nmero de aco inical y nuemro de arco final
             //si cosigo hacer lo  de graphics cambia
             Attr arcoI = doc.createAttribute("arcoInicial");
             arcoI.setValue(""+arco.getInicial().getNumeroNodo());
             xArco.setAttributeNode(arcoI);
             Attr arcoF= doc.createAttribute("arcoFinal");
              arcoF.setValue(""+arco.getFfinal().getNumeroNodo());
              xArco.setAttributeNode(arcoF);
              Attr peso = doc.createAttribute("peso");
              peso.setValue(""+arco.getPeso());
              xArco.setAttributeNode(peso);
              
             
                
       }
       
       //Escribimos el codigo en el xml

		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		DOMSource source = new DOMSource(doc);
		StreamResult result = new StreamResult(new File(ruta));
                
                
                
                transformer.transform(source, result);
                
                
         
                
 
         
       }  
       
         catch (ParserConfigurationException pce) {
		pce.printStackTrace();
	  } 
         catch (TransformerException tfe) {
		tfe.printStackTrace();
         }
   }
   
   
   /**
    * Metodos para limpiar codigo
    */
   
 
   
    
}
